#课后习题4作业
from skimage import filters,data
import numpy as np
from matplotlib import pyplot as plt
def correl2d(img,window):
    m=window.shape[0]
    n=window.shape[1]
    #边界通过0灰度值填充扩展
    img1=np.zeros((img.shape[0]+m-1,img.shape[1]+n-1))
    img1[(m-1)//2:(img.shape[0]+(m-1)//2),(n-1)//2:(img.shape[0]+(n-1)//2)]=img
    img2=np.zeros(img.shape)
    #进行相关运算得到空间滤波
    for i in range(img2.shape[0]):
        for j in range(img2.shape[1]):
            temp=img1[i:i+m,j:j+n]
            img2[i,j]=np.sum(np.multiply(temp,window))
    return img2
#img原始图像
img=data.camera()
#原始图像进行拉普拉斯锐化 
window=np.array([[-1,-1,-1],[-1,8,-1],[-1,-1,-1]])  #中心系数为正的扩展的拉普拉斯算子
img_laplace=correl2d(img,window)
img_laplace=255*(img_laplace-img_laplace.min())/(img_laplace.max()-img_laplace.min())

#原始图像与拉普拉斯变换图像相加所得的拉普拉斯锐化增强图像
img_laplace_enhance=img+img_laplace

#原始图像经过索贝尔梯度处理
img_sobel=filters.sobel(img)

#使用5*5均值滤波器对经过梯度处理后的图像进行平滑
window_mean=np.ones((5,5))/5**2
img_sobel_mean=correl2d(img_sobel,window_mean)

#将拉普拉斯锐化增强的图像与平滑索贝尔图像相乘多得到的掩蔽图像
img_mask=img_laplace_enhance*img_sobel_mean

#原始图像与掩蔽图像相加所得的锐化增强图像
img_sharp_enhance=img+img_mask

#对锐化增强图像进行灰度幂律变换所得的最终结果
img_enhance=img_sharp_enhance**0.5
plt.figure()
plt.imshow(img)
plt.savefig('img')
plt.figure()
plt.imshow(img_enhance)















